# Maintainer: Marian Buschsieweke <marian.buschsieweke@ovgu.de>
# Based upon Alpine's avr-gcc and Arch Linux's arm-none-eabi-gcc, to which
# the following people contributed:
# Contributor: Pedro Filipe <xpecex@outlook.com>
# Contributor: Stefan Wagner <stw@bit-strickerei.de>
# Contributor: Anatol Pomozov <anatol.pomozov@gmail.com>
# Contributor: Martin Schmölzer <mschmoelzer@gmail.com>
_targets="
	arm-none-eabi
	mips-mti-elf
	msp430-elf
	"
# or1k-elf fails to build on 32-bit architectures
case "$CARCH" in
	x86_64|aarch64|ppc64le|mips64) _targets="$_targets or1k-elf"
esac
pkgname=gcc-cross-embedded
pkgver=9.3.0
pkgrel=0
pkgdesc="The GNU Compiler Collection for embedded targets"
url="http://gcc.gnu.org"
depends="gcc"
makedepends="bash linux-headers gmp-dev mpfr-dev mpc1-dev zlib-dev"
arch="all !s390x !mips !mips64" # fails on s390x and mips with error message:
# 'internal compiler error: Segmentation fault'
license="GPL-3.0-or-later"
for target in $_targets; do
	targetnorm="${target//-/_}"
	subpackages="gcc-$target:$targetnorm $subpackages"
	makedepends="$makedepends binutils-$target newlib-$target-stage1"
done

_islver=0.20
source="https://mirrors.kernel.org/gnu/gcc/gcc-$pkgver/gcc-$pkgver.tar.xz
	http://isl.gforge.inria.fr/isl-$_islver.tar.bz2"

options="!check"

builddir="$srcdir/gcc-$pkgver"

prepare() {
	default_prepare

	# link isl for in-tree build
	ln -s "$srcdir"/isl-"$_islver" isl

	# hack! - some configure tests for header files using "$CPP $CPPFLAGS"
	for dir in libiberty gcc; do
		sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" $dir/configure
	done
}

_build_gcc() {
	case "$target" in
		or1k-elf) _multilib_list="" ;;
		*) _multilib_list="rmprofile" ;;
	esac

	"$builddir"/configure \
		--target=$target \
		--prefix=/usr \
		--with-sysroot=/usr/$target \
		--with-native-system-header-dir=/include \
		--with-headers=/usr/$target/include \
		--with-python-dir=share/gcc-$target \
		--libexecdir=/usr/lib \
		--infodir=/deleteme/info \
		--htmldir=/deleteme/html \
		--pdfdir=/deleteme/pdf \
		--mandir=/deleteme/man \
		--enable-languages=c,c++ \
		--enable-plugins \
		--enable-gnu-indirect-function \
		--disable-decimal-float \
		--disable-libffi \
		--disable-libgomp \
		--disable-libmudflap \
		--disable-libquadmath \
		--disable-libssp \
		--disable-libstdcxx-pch \
		--disable-nls \
		--disable-shared \
		--disable-threads \
		--disable-tls \
		--disable-werror \
		--with-gmp \
		--with-gnu-as \
		--with-gnu-ld \
		--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' \
		--with-isl \
		--with-libelf \
		--with-mpc \
		--with-mpfr \
		--with-multilib-list=$_multilib_list \
		--with-newlib \
		--with-system-zlib \
		--with-pkgversion='Alpine Linux'
	make INHIBIT_LIBC_CFLAGS='-DUSE_TM_CLONE_REGISTRY=0'
}

build() {
	for target in $_targets; do
		# Build "regular" variant
		workingdir="$srcdir/build-$target"
		mkdir "$workingdir"
		cd "$workingdir"
		export CFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections'
		export CXXFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections'
		_build_gcc

		# Rebuild without exceptions to generate nano variant of libstc++
		workingdir="$srcdir/build-$target-nano"
		mkdir "$workingdir"
		cd "$workingdir"
		export CFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections  -fno-exceptions'
		export CXXFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections  -fno-exceptions'
		_build_gcc
	done
}

package() {
	for target in $_targets; do
		depends="$depends gcc-$target"
	done
	mkdir -p "$pkgdir"
}

_install_subpkg() {
	target="${subpkgname#gcc-}"
	pkgdesc="The GNU Compiler Collection for $target targets"
	depends="$depends binutils-$target"
	workingdir="$srcdir/build-$target"
	cd "$workingdir"
	make install DESTDIR="$subpkgdir" -j1

	# install nano-variant into temporary folder to obtain libstdc++ from there
	workingdir="$srcdir/build-$target-nano"
	cd "$workingdir"
	make install DESTDIR="$subpkgdir-nano" -j1

	# Fetch libstdc++ from nano variant
	multilibs=$($subpkgdir/usr/bin/$target-gcc -print-multi-lib 2>/dev/null)
	for multilib in $multilibs; do
		dir="${multilib%%;*}"
		from_dir=$subpkgdir-nano/usr/$target/lib/$dir
		to_dir=$subpkgdir/usr/$target/lib/$dir
		cp -f $from_dir/libstdc++.a $to_dir/libstdc++_nano.a
		cp -f $from_dir/libsupc++.a $to_dir/libsupc++_nano.a
	done

	# Delete documentation. (The user can use the host GCC doc instead)
	rm -rf "$subpkgdir"/deleteme
	# Delete libcc1.so*, which is already part of the host's gcc
	rm -f "$subpkgdir"/usr/lib/libcc1.so*

	# Strip libs using target binutils
	find "$subpkgdir"/usr/lib -type f -name "*.a" -exec /usr/bin/$target-strip --strip-debug '{}' \;

	# Strip executables using host binutils
	find "$subpkgdir"/usr/bin -type f -executable -exec strip '{}' \;
}

arm_none_eabi() {
	_install_subpkg
}

mips_mti_elf() {
	_install_subpkg
}

msp430_elf() {
	_install_subpkg
}

or1k_elf() {
	_install_subpkg
}

sha512sums="4b9e3639eef6e623747a22c37a904b4750c93b6da77cf3958d5047e9b5ebddb7eebe091cc16ca0a227c0ecbd2bf3b984b221130f269a97ee4cc18f9cf6c444de  gcc-9.3.0.tar.xz
afe2e159b74646a26449268637403d271f9e3f6410d8cc1c9cffca41370c4357b165dea844db0c2a654591f954e54710dda650c8088abd4711406aa6302da950  isl-0.20.tar.bz2"
